Podkwerendy SQL

Podkwerend╣ jest instrukcja SELECT zagnie┐d┐ona wewn╣trz instrukcji SELECT, SELECT...INTO, INSERT...INTO, DELETE, lub UPDATE albo we wnΩtrzu innej podkwerendy.

Sk│adnia

W celu utworzenia podkwerendy mo┐na u┐yµ nastΩpuj╣cych trzech postaci sk│adni:

por≤wnanie [ANY | ALL | SOME] (instrukcja_sql)

wyra┐enie [NOT] IN (instrukcja_sql)

[NOT] EXISTS (instrukcja_sql)

Podkwerenda sk│ada siΩ z nastΩpuj╣cych element≤w:

Element Opis
por≤wnanie Wyra┐enie i operator por≤wnania por≤wnuj╣cy wyra┐enie z wynikiem podkwerendy.
wyra┐enie Wyra┐enie, kt≤rego warto£µ jest poszukiwana w zbiorze wynik≤w podkwerendy.
instrukcja_sql Instrukcja SELECT o takim samym formacie i spe│niaj╣ca te same regu│y, co ka┐da instrukcja SQL. Musi byµ ujΩta w nawiasy.

Uwagi

Mo┐na u┐yµ podkwerendy zamiast wyra┐enia w li£cie p≤l instrukcji SELECT lub klauzuli WHERE czy HAVING. W podkwerendzie instrukcja SELECT s│u┐y to dostarczenia jednej lub wiΩcej warto£ci, kt≤re bior╣ udzia│ w obliczaniu wyra┐e± klauzul WHERE lub HAVING.

Predykaty ANY oraz SOME, bΩd╣ce synonimami, s│u┐╣ do pobierania rekord≤w w g│≤wnej kwerendzie, spe│niaj╣cych por≤wnanie z dowolnym rekordem pobranym przez podkwerendΩ. Poni┐szy przyk│ad zwraca wszystkie wyroby, kt≤rych cena jednostkowa jest wiΩksza ni┐ cena dowolnego innego wyrobu sprzedawanego z rabatem 25 procent lub wy┐szym:

SELECT * FROM Produkty

WHERE CenaJednostkowa > ANY

(SELECT CenaJednostkowa FROM OpisyZam≤wie±

WHERE Rabat >= .25);

Predykat ALL jest u┐ywany do pobierania tylko tych warto£ci z wyniku g│≤wnej kwerendy, kt≤re spe│niaj╣ por≤wnanie ze wszystkimi rekordami pobranymi przez podkwerendΩ. Je£li w poprzednim przyk│adzie zamienimy ANY na ALL, to kwerenda zwr≤ci tylko te produkty, kt≤rych cena jednostkowa jest wiΩksza ni┐ cena wszystkich produkt≤w sprzedawanych z rabatem 25 procent lub wy┐szym. Jest to o wiele ostrzejsze ograniczenie.

Predykat IN s│u┐y do pobierania w g│≤wnej kwerendzie tylko tych rekord≤w, dla kt≤rych w podkwerendzie istniej╣ rekordy zawieraj╣ce takie same warto£ci. Poni┐szy przyk│ad zwraca wszystkie produkty sprzedawane z rabatem 25 procent lub wy┐szym:

SELECT * FROM Produkty

WHERE NrProduktu IN

(SELECT NrProduktu_FROM OpisyZam≤wie±

WHERE Rabat >= .25);

I odwrotnie, mo┐na u┐yµ predykatu NOT IN do pobrania w g│≤wnej kwerendzie tylko tych rekord≤w, dla kt≤rych w podkwerendzie nie istniej╣ rekordy zawieraj╣ce takie same warto£ci.

Predykat EXISTS (z nieobowi╣zkowym s│owem zastrze┐onym NOT) jest u┐ywany w por≤wnaniach logicznych do okre£lenia, czy podkwerenda zwr≤ci│a jakiekolwiek rekordy.

Mo┐na tak┐e u┐yµ alias≤w nazw tabel w podkwerendzie, aby odwo│aµ siΩ do tabel wymienionych w klauzuli FROM na zewn╣trz podkwerendy. Poni┐szy przyk│ad zwraca nazwiska pracownik≤w, kt≤rych zarobki s╣ r≤wne lub wy┐sze od przeciΩtnych zarobk≤w wszystkich pracownik≤w na tym samym stanowisku. Tabela Pracownicy ma alias "T1".

SELECT Nazwisko,

ImiΩ, Stanowisko, Wynagrodzenie

FROM Pracownicy AS T1

WHERE Wynagrodzenie >=

(SELECT Avg(Wynagrodzenie)

FROM Pracownicy

WHERE T1.Stanowisko = Pracownicy.Stanowisko) Order by Stanowisko;

W powy┐szym przyk│adzie s│owo zastrze┐one AS jest nieobowi╣zkowe.

Niekt≤re podkwerendy s╣ dopuszczalne w kwerendzie krzy┐owej ù zw│aszcza jako predykaty (w klauzuli WHERE). Podkwerendy jako wynik (czyli te znajduj╣ce siΩ na li£cie SELECT) nie s╣ dozwolone w kwerendach krzy┐owych.

Zobacz te┐
ALL, DISTINCT, DISTINCTROW, TOP û predykaty (Microsoft Jet SQL) SELECT - instrukcja (Microsoft Jet SQL)
DELETE û instrukcja (Microsoft Jet SQL) SELECT INTO û instrukcja (Microsoft Jet SQL)
HAVING û klauzula (Microsoft Jet SQL) UNION û operacja (Microsoft Jet SQL)
INNER JOIN û operacja (Microsoft Jet SQL) UPDATE û instrukcja (Microsoft Jet SQL)
INSERT INTO û instrukcja (Microsoft Jet SQL) WHERE û klauzula (Microsoft Jet SQL)
LEFT JOIN, RIGHT JOIN û operacje (Microsoft Jet SQL)  

Przyk│ad

Podkwerendy SQL - przyk│ad